People today use the World Wide Web for a variety of different and diverse tasks for example locating information, ordering and buying goods on-line and managing their finances. Users expect that these applications will operate regardless of what type of computer platform is used. It would be inconvenient and cumbersome if a different application had to be launched for each type of computer platform. This would be an inconvenience not only for the users of the launched application but the application developers as well.
Java technology, which is a trademark of Sun Microsystems, Inc, provides a solution to this problem by allowing the creation of computer platform independent programs. The Java technology consists of an object orientated programming language and a platform on which to run the Java applications. Java is both a compiled and an interpreted language. The source code that has been written by the application developer is compiled into an intermediate form called a Java bytecode, which is a platform independent language and sent over the network to a client machine where the java bytecodes are interpreted by the Java platform and the Java interpreter parses and runs each Java bytecode instruction on the computer.
Java's objected orientated programming language is based on using objects and classes and this paragraph will introduce the reader to a few basic concepts. Just like real world objects, software objects consist of a state and a behavior. A software object maintains its state in one or more variables and a variable is an item of data named by an identifier. A software object implements its behavior with methods and a method is a function associated with an object. Just like any other objected orientated programming language objects communicate with each other by passing messages. Further object orientated concepts are well known in the art and will not be described here further.
The Java platform consists of the Application Programming Interface (API), which is a large collection of ready-made software components, which provide a variety of capabilities, and the Java Virtual Machine (JVM) which will be explained in the paragraph below. Together the JVM and the API sit on top of the hardware based computer platform and provide a layer of abstraction between the Java program and the underlying hardware.
The JVM is made up of software, which can run a Java program on a specific computer platform of a client machine. Before a Java program can be run on a JVM, the Java program must first be translated into a format that the JVM recognizes, which is called a Java class file format. The Java class file format contains all the information needed by a Java runtime system to define a single Java class.
The JVM running on a particular computer can be divided into four basic parts: the registers, the stack, the garbage-collected heap, and the method area.
Like most other object-orientated applications, a Java application typically allocates new objects to a region of the system memory within a data processing system commonly referred to as the ‘heap’ and each JVM has its own heap. Java does not have a ‘free’ or ‘delete’ method, which allows a Java application to free objects that are no longer required by the system. Instead when a Java application executes on a particular computer platform the Java application relies on a garbage collection process which is the responsibility of the JVM, to reclaim space within the heap that is no longer utilized by previously allocated objects.
When the client computer invokes a method on a remote object, a message is sent to the server process that hosts the remote object. The message must specify which particular object is to have its method invoked. For example the object to which the message is addressed (yourCar) and the name of the method to perform (changeGears) and any parameters needed by the method (higherGear).
A remote object reference is an identifier for a remote object that is valid throughout the computer system. An object is determined as being live whilst there is an object reference pointer to it somewhere in the active state of the JVM and therefore the object is able to be located. When an object ceases to be referenced from the active state within the JVM it can be classified as garbage. The memory space occupied by the object can then be reclaimed for reuse and garbage collected. Garbage collection is usually triggered whenever the Java application attempts to create a new object, and it is determined that there is insufficient free space available within the heap to satisfy an object allocation.
Garbage collection is usually performed in a synchronous manner. Generally, the synchronous garbage collection begins its operation by temporarily stopping all Java applications within the JVM. The synchronous garbage collection then traverses a Java stack and the heap in order to search for all the active objects and their children. These active objects and their children are then marked accordingly. Afterwards the heap is searched again for a second time to reclaim any space previously utilized by the unmarked objects. Finally the Java applications are restarted again. This type of garbage collection is typically called ‘stop the world’ as all applications are stopped whilst garbage collection is performed and restarted when the garbage collection process has finished.
When multiple JVM's are running on the same computer, there arises a need to minimize the footprint of each JVM, such that memory resources are utilized to their full advantage and therefore it is important to share as much data as possible with other individually running JVM's on the same computer. Typically the data to be shared between the multiple JVM's could be any read only data for example all Java classes together with their bytecode and equivalent Just-In-Time (JIT) code, or the data structures representing methods and classes. A Just-In-Time code generator generates JIT code, which is a technique for speeding up the execution of interpreted programs such as Java. JIT code is created before a method is run for the first time. The Java interpreter converts the Java byte code for the method into native machine code, which, the computer can then execute directly rather than via a Java interpreter.
Generally the shared data that is used by multiple JVM's on the same computer is not stored in the heap of any one JVM, but instead it is stored in a shared area called the system heap. Often the system heap is not garbage collected as multiple JVM's running on the same computer could each have a reference or many references to a shared object or any other shared data in the system heap. This leads to an environment, in which it is difficult to determine which objects are live within the system and which are eligible for garbage collection as there currently is no means in which to co-ordinate the actions of multiple JVM's running on the same computer, to determine whether an object can be garbage collected to free the resources that the object utilized.
The problem has been described only in the context of Java, but the same problem arises in other programming environments where there is a need for the automatic reclamation of heap-allocated storage after its last use by a program and further when there arises a need for automatic dynamic memory management. An example of other programming environments are, but not limited to C, C++, Smalltalk, Eiffel, Dylan, Modula-3 and Oberon.